#pragma once
#include <exception>
#include <memory>

#include "Util.h"

namespace util {
    namespace exception{
        using namespace std;


        class BaseException : public std::exception{
        public:
            virtual void w_what(unique_ptr<WSTR_STRUCT>* pupWstr) const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
        };

        class CustomException : public BaseException{
        public:
            CustomException(const char * msg);

            virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW;
        protected:
            const char * msg;
        };

        class UnexpectedException : public CustomException{
        public:
            UnexpectedException(const char * msg);
        };

        class NoInitializeException : public CustomException{
        };
    }
}